package org.jsola.hr.task;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.extern.slf4j.Slf4j;
import org.jsola.common.DateKit8;
import org.jsola.hr.constant.ContractDateEnum;
import org.jsola.hr.constant.ContractStatusEnum;
import org.jsola.hr.entity.EmpPaperContractDO;
import org.jsola.hr.service.IEmpPaperContractService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * 纸质合同相关定时任务
 *
 * @author wu
 */
@Slf4j
@Component
public class PaperContractTask {


    @Autowired
    private IEmpPaperContractService empPaperContractService;

    /**
     * 	修改纸质合同状态
     */
    @XxlJob("paperContractUpdateStatus")
    public ReturnT<String> paperContractUpdateStatus(String params) {
        XxlJobLogger.log("==========定时任务开始: 修改纸质合同状态");
        try {
            paperContractUpdateStatus();
        } catch (Exception e) {
            XxlJobLogger.log("==========定时任务失败: 修改纸质合同状态,失败原因 : {}", e.getMessage());
            return ReturnT.FAIL;
        }
        XxlJobLogger.log("==========定时任务结束: 修改纸质合同状态");
        return ReturnT.SUCCESS;
    }

    public void paperContractUpdateStatus() throws ParseException {
        long time = System.currentTimeMillis();
        // 查询全部纸质合同
        List<EmpPaperContractDO> empPaperContractDOList = empPaperContractService.selectAll();
        if (CollectionUtils.isEmpty(empPaperContractDOList)) {
            return;
        }
        // 记录修改数量
        int updateCount = 0;
        // 修改纸质合同的状态
        for (EmpPaperContractDO empPaperContractDO : empPaperContractDOList) {
            Date startTime = empPaperContractDO.getStartTime();
            Date endTime = empPaperContractDO.getEndTime();
            Integer timeLimit = empPaperContractDO.getTimeLimit();
            Integer timeLimitType = empPaperContractDO.getTimeLimitType();
            // 如果开始和结束时间都是空的 则跳过
            if (startTime == null && endTime == null) {
                continue;
            }
            // 如果存在开始时间 且开始时间大于现在的时间 则修改状态为未执行
            if (startTime != null && startTime.getTime() > System.currentTimeMillis()) {
                empPaperContractDO.setStatus(ContractStatusEnum.NOT_STARTED.getValue());
                empPaperContractService.updateByIdSelective(empPaperContractDO);
                updateCount++;
                continue;
            }
            // 如果存在结束时间 且结束时间小于现在的时间 则修改状态为已到期
            if (endTime != null && endTime.getTime() < System.currentTimeMillis()) {
                empPaperContractDO.setStatus(ContractStatusEnum.EXPIRE.getValue());
                empPaperContractService.updateByIdSelective(empPaperContractDO);
                updateCount++;
                continue;
            }
            // 如果开始时间和结束时间都不为空 且现在的时间在开始时间和结束时间范围内 则修改状态为执行中
            if (startTime != null && endTime != null
                    && startTime.getTime() < System.currentTimeMillis()
                    && endTime.getTime() > System.currentTimeMillis()) {
                empPaperContractDO.setStatus(ContractStatusEnum.IMPLEMENT.getValue());
                empPaperContractService.updateByIdSelective(empPaperContractDO);
                updateCount++;
                continue;
            }
            // 如果前面都不满足 且合同期限 或 合同期限单位为空
            if (timeLimit == null || timeLimitType == null) {
                continue;
            }
            if (ContractDateEnum.YEAR.getValue().equals(timeLimitType)) {
                timeLimit = timeLimit * 12;
            }
            if (startTime != null) {
                // 说明存在开始时间 且开始时间小于现在的时间，则需要根据合同期限和期限单位计算结束时间，来判断合同状态是执行中还是已到期
                Date newEndTime = DateKit8.addMonths(startTime, timeLimit);
                empPaperContractDO.setEndTime(newEndTime);
                empPaperContractDO.setStatus(newEndTime.getTime() > System.currentTimeMillis() ?
                        ContractStatusEnum.IMPLEMENT.getValue() : ContractStatusEnum.EXPIRE.getValue());
                empPaperContractService.updateByIdSelective(empPaperContractDO);
            } else {
                // 说明存在结束时间 且结束时间大于现在的时间，则需要根据合同期限和期限单位计算开始时间，来判断合同状态是未执行还是执行中
                Date newStartTime = DateKit8.addMonths(endTime, -timeLimit);
                empPaperContractDO.setStartTime(newStartTime);
                empPaperContractDO.setStatus(newStartTime.getTime() > System.currentTimeMillis() ?
                        ContractStatusEnum.NOT_STARTED.getValue() : ContractStatusEnum.IMPLEMENT.getValue());
                empPaperContractService.updateByIdSelective(empPaperContractDO);
            }
            updateCount++;
        }
        log.info("修改纸质合同状态，总共用时：{}, 查询到的纸质合同数量：{}， 修改的合同数量：{}",
                System.currentTimeMillis() - time, empPaperContractDOList.size(), updateCount);
    }
}
